package mscloud.config;

import com.alibaba.nacos.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 * Redis 配置类
 * <p>
 * 该配置类用于配置 Redis 连接，支持从 Nacos 配置中心动态加载 Redis 连接参数。
 * 使用 Lettuce 作为 Redis 客户端，提供高性能的异步连接支持。
 * </p>
 *
 * <p>配置项说明：</p>
 * <ul>
 *   <li>spring.redis.host - Redis 服务器地址</li>
 *   <li>spring.redis.port - Redis 服务器端口</li>
 *   <li>spring.redis.password - Redis 认证密码（可选）</li>
 *   <li>spring.redis.database - Redis 数据库索引</li>
 * </ul>
 *
 * @author Eleven52AC
 * @version 1.0
 * @since 2025-01-01
 */
@Configuration
public class RedisConfig {

    /**
     * Redis 服务器主机地址
     * <p>
     * 从配置中心获取 Redis 服务器的 IP 地址或域名
     * </p>
     */
    @Value("${spring.redis.host}")
    private String host;

    /**
     * Redis 服务器端口号
     * <p>
     * Redis 服务器监听的端口，默认为 6379
     * </p>
     */
    @Value("${spring.redis.port}")
    private int port;

    /**
     * Redis 认证密码
     * <p>
     * Redis 服务器的认证密码，如果 Redis 未设置密码则为空字符串。
     * 使用默认值空字符串，避免在未配置密码时出现配置加载异常。
     * </p>
     */
    @Value("${spring.redis.password:}")
    private String password;

    /**
     * Redis 数据库索引
     * <p>
     * 指定连接到 Redis 的哪个数据库，Redis 默认有 16 个数据库（索引 0-15）
     * </p>
     */
    @Value("${spring.redis.database}")
    private int database;

    /**
     * 创建 Lettuce 连接工厂
     * <p>
     * 根据配置参数创建 Redis 连接工厂，该工厂用于创建和管理 Redis 连接。
     * Lettuce 是一个基于 Netty 的高性能 Redis 客户端，支持同步、异步和响应式编程模式。
     * </p>
     *
     * <p>配置特性：</p>
     * <ul>
     *   <li>支持单机 Redis 配置</li>
     *   <li>支持密码认证（当配置了密码时）</li>
     *   <li>支持指定数据库索引</li>
     *   <li>基于 Lettuce 客户端，提供连接池支持</li>
     * </ul>
     *
     * @return LettuceConnectionFactory Redis 连接工厂实例
     * @throws IllegalArgumentException 当配置参数无效时抛出
     *
     * @see LettuceConnectionFactory
     * @see RedisStandaloneConfiguration
     */
    @Bean(name = "redisConnectionFactory")
    public RedisConnectionFactory redisConnectionFactory(){
        // 创建 Redis 独立配置对象
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
        // 设置 Redis 服务器地址和端口
        config.setHostName(host);
        config.setPort(port);
        // 设置数据库索引
        config.setDatabase(database);
        // 如果配置了密码，则设置认证密码
        if (StringUtils.hasText(password)) {
            config.setPassword(RedisPassword.of(password));
        }
        // 创建并返回 Lettuce 连接工厂
        return new LettuceConnectionFactory(config);
    }


    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        return new StringRedisTemplate(redisConnectionFactory);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }


}